#include "baseVector.h"

Point pt(float x, float y, float z)
{
  Point p;
  p.x = x;
  p.y = y;
  p.z = z;
  return p;
}

double rad (double x)
{ return x*PI/180; }

void print_point (Point p)
{
  printf("(%f,%f,%f)\n",p.x,p.y,p.z);
}

/*************************************************************************/
/* Fonctions de dessin */
/*************************************************************************/

/* rouge vert bleu entre 0 et 1 */
void chooseColor(double r, double g, double b)
{
/* le alpha est fixé a 0.7 */
  glColor4d(r,g,b,0.7);
  /* glColor3d(r,g,b); */
}

void chooseColorOpaque(double r, double g, double b)
{
  glColor4d(r,g,b,0.7);
}

unsigned char estBlanc(Couleur c)
{
/* on s'accorde une petit erreur avec les double */
  int bool=1;
  double err=0.0001;
  if ((c.R<1.-err)||(c.R>1.+err))
    bool=0;
  if ((c.G<1.-err)||(c.G>1.+err))
    bool=0;
  if ((c.B<1.-err)||(c.B>1.+err))
    bool=0;

  return bool;
}

void drawPoint(double x, double  y, double z)
{
  glBegin(GL_POINTS);
  glVertex3d(x,y,z);
  glEnd();
}

Couleur cl (double r,double g,double b)
{
  Couleur c;
  c.R=r;
  c.G=g;
  c.B=b;
  return c;
}

void chooseCouleur (Couleur c)
{
  chooseColor(c.R,c.G,c.B);
}


void drawTruePoint(Point p)
{
  drawPoint(p.x,p.y,p.z);
  return;
}



void drawLine(double x1, double  y1, double z1, double x2, double y2, double z2)
{
  glBegin(GL_LINES);
  glVertex3d(x1,y1,z1);
  glVertex3d(x2,y2,z2);
  glEnd();
}

void drawTrueLine(Point p1,Point p2)
{
  drawLine(p1.x,p1.y,p1.z,
	   p2.x,p2.y,p2.z);
  return;
}

void drawQuad(Point p1, Point p2, Point p3, Point p4)
{
  /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */
  glBegin(GL_QUADS);
  glVertex3f(p1.x,p1.y,p1.z);
  glVertex3f(p2.x,p2.y,p2.z);
  glVertex3f(p3.x,p3.y,p3.z);
  glVertex3f(p4.x,p4.y,p4.z);
  glEnd();
}


/* Point est utilisé comme un vecteur 3d! */
double norme3d (Point a)
{
  return sqrt(scalaire(a,a));
}

/* Point est utilisé comme un vecteur 3d! */
double scalaire (Point a,Point b)
{
  return a.x*b.x+a.y*b.y+a.z*b.z;
}

Point normalise (Point a)
{
  Point result;
  double n=norme3d(a);
  result.x=a.x/n;
  result.y=a.y/n;
  result.z=a.z/n;
  return result;
}

Point toVector (Point a,Point b)
{
  return pt(a.x-b.x,a.y-b.y,a.z-b.z);
}


Point** newMatricePoint_noSquare (int ligne,int colonne)
{
  int i;
  Point** m=NULL;
  m=malloc(sizeof(*m)*ligne);
  if (m==NULL)
    exit(1);
  for (i=0;i<ligne;i++)
    {
      m[i]=malloc(sizeof(*(m[i]))*colonne);
      if (m[i]==NULL)
	exit(1);
    }
  return m;
}

Point** newMatricePoint (int nbcoup)
{
  return newMatricePoint_noSquare(nbcoup,nbcoup);
}


Couleur** newMatriceCouleur (int nbcoup)
{
  int i;
  Couleur** m=NULL;
  m=malloc(sizeof(*m)*nbcoup);
  if (m==NULL)
    exit(1);
  for (i=0;i<nbcoup;i++)
    {
      m[i]=malloc(sizeof(*(m[i]))*nbcoup);
      if (m[i]==NULL)
	exit(1);
    }
  return m;
}

void libererMatricePoint(Point** matrice,int nbcoup)
{
  int i;
  for (i=0;i<nbcoup;i++)
    free(matrice[i]);
  free(matrice);
  return;
}
void libererMatriceCouleur(Couleur** matrice,int nbcoup)
{
  int i;
  for (i=0;i<nbcoup;i++)
    free(matrice[i]);
  free(matrice);
  return;
}

